import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 1. 读取输入数据
        int n = sc.nextInt(); // 田地数量
        int m = sc.nextInt(); // 已有路径数量
        int t0 = sc.nextInt(); // 捷径耗时

        int[] c = new int[n + 1]; // c[i]：田地i的奶牛数量（1-based索引）
        for (int i = 1; i <= n; i++) {
            c[i] = sc.nextInt();
        }

        // 2. 建图：邻接表存储双向路径
        List<List<int[]>> adj = new ArrayList<>();
        for (int i = 0; i <= n; i++) {
            adj.add(new ArrayList<>());
        }
        for (int i = 0; i < m; i++) {
            int u = sc.nextInt();
            int v = sc.nextInt();
            int w = sc.nextInt();
            adj.get(u).add(new int[]{v, w}); // u到v的路径
            adj.get(v).add(new int[]{u, w}); // v到u的路径（双向）
        }

        // 3. Dijkstra算法：求所有田地到牛棚（1号）的最短时间d[i]
        long[] d = new long[n + 1];
        Arrays.fill(d, Long.MAX_VALUE); // 初始化为无穷大
        d[1] = 0; // 牛棚到自身时间为0

        // 优先队列：存储(当前最短时间, 节点编号)，按时间升序排序
        PriorityQueue<long[]> pq = new PriorityQueue<>(Comparator.comparingLong(a -> a[0]));
        pq.add(new long[]{0, 1});

        while (!pq.isEmpty()) {
            long[] curr = pq.poll();
            long currentDist = curr[0];
            int u = (int) curr[1];

            // 若当前距离已大于已知最短距离，跳过（冗余节点）
            if (currentDist > d[u]) {
                continue;
            }

            // 遍历u的所有相邻节点，更新最短距离
            for (int[] neighbor : adj.get(u)) {
                int v = neighbor[0];
                long w = neighbor[1];
                if (d[v] > d[u] + w) {
                    d[v] = d[u] + w;
                    pq.add(new long[]{d[v], v});
                }
            }
        }

        // 4. 计算添加捷径后的最大总减少量
        long maxReduction = 0;
        for (int i = 1; i <= n; i++) {
            if (d[i] == Long.MAX_VALUE) {
                continue; // 若田地i无法到达牛棚，跳过（无意义）
            }
            // 单块田地的减少量：max(0, 原时间-捷径时间) × 奶牛数
            long reduction = Math.max(0, d[i] - t0) * c[i];
            maxReduction += reduction; // 累加总减少量
        }

        // 5. 输出结果
        System.out.println(maxReduction);
        sc.close();
    }
}